/*
Copyright 2011 Mary Suárez Machado

Este programa es de software libre: usted puede redistribuirlo y/o modificarlo según los términos de la Licencia de Gran pública de GNU como publicado por la Fundación de Software Libre, versión 3 de la Licencia, (o en su opción) cualquier versión posterior.

 Este programa es distribuido en la esperanza que será útil, pero SIN CUALQUIER GARANTÍA; sin aún la garantía implícita de VALOR COMERCIAL O SALUD PARA UN OBJETIVO PARTICULAR. Mirar la Licencia de Gran pública de GNU para más detalles.
*/


#ifndef _GUNLZCODER_H_
#define _GUNLZCODER_H_

#include <iostream>
#include <VectorBits.h>
#include <Vector.h>
#include <TablaHuffmanLC.h>
#include <TablaHuffmanD.h>
#include <TablaDistancia.h>
#include <TablaLongitud.h>

 /**
 *@file GunLZcoder.h
 *@brief Interfaz para descomprimir un texto
 *
 */

 /**
 * \class GunLZcoder
 *
 * \brief Modulo que descomprime un texto
 *         
 * \author Mary Carmen Suárez 
 *
 */
	class GunLZcoder
	{
		private:
			VectorBits vb;
			int leidos;
			Vector vector_salida;
			TablaHuffmanLC hlc;
			TablaHuffmanD hd;
			TablaDistancia td;
			TablaLongitud tl;
		public:
			/**
			@brief Constructor por defecto
			@pos inicializa leidos a 3
			*/
			GunLZcoder ();
			/**
			@brief Constructor con un parametro
			@pos inicializa el vector de bits con orig y leidos a 3
			*/
			GunLZcoder (const VectorBits & orig);
			/**
			@brief Destructor por defecto
			*/
			~GunLZcoder ();
			/**
			@brief Calcula el siguiente codigo codificado
			@pos Devuelve dicho codigo
			*/
			int SimboloHuffman ();
			/**
			@brief Descodifica un codigo
			@param simbolo, codigo que queremos descodificar
			*/
			void DescodificarSimbolo (int simbolo);
			/**
			@brief Funcion que descodifica un fichero
			@param os, flujo donde devolvemos el fichero descomprimido
			*/
			void Descodificacion (std::ostream & os);
			/**
			@brief Calcula el crc de un fichero
			@return devuelve el crc calculado
			*/
			unsigned int GetParidad () const;
			/**
			@brief Calcula el numero de elementos que hemos descodificado
			@return devuelve dicho numero
			*/
			unsigned int Nelem () const;
	};

#endif
